package com.dts.yjnb.service.service.impl;

import com.dts.common.exception.ServiceException;
import com.dts.yjnb.service.domain.Agricultural;
import com.dts.yjnb.service.domain.CreditInfo;
import com.dts.yjnb.service.domain.Market;
import com.dts.yjnb.service.domain.Product;
import com.dts.yjnb.service.domainDto.AllowancePolicyDTO;
import com.dts.yjnb.service.domainVo.AllowancePolicyVo;
import com.dts.yjnb.service.mapper.AgriculturalMapper;
import com.dts.yjnb.service.mapper.CreditInfoMapper;
import com.dts.yjnb.service.mapper.MarketMapper;
import com.dts.yjnb.service.mapper.NbAllowancePolicyMapper;
import com.dts.yjnb.service.mapper.ProductMapper;
import com.dts.yjnb.service.service.ReportService;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.List;
@Service
public class ReportServiceImpl implements ReportService {
    
    @Autowired
    private ProductMapper productMapper;
    @Autowired
    private MarketMapper marketMapper;
    @Autowired
    private AgriculturalMapper agriculturalMapper;
    @Autowired
    private CreditInfoMapper creditInfoMapper;
    @Autowired
    private NbAllowancePolicyMapper nbAllowancePolicyMapper;
    
    @Override
    public void exportBusinessDate(HttpServletResponse response) throws IOException {
        //1.查询数据库，获取营业数据

        // 开始分页
        Product product = new Product();
        PageHelper.startPage(1, 10);
        Page<Product> page = productMapper.pageQuery(product);

        long total = page.getTotal();
        List<Product> records = page.getResult();

        //2.通过POI将数据写入到Excel文件中
        InputStream in = this.getClass().getClassLoader().getResourceAsStream("templates/product.xlsx");

        XSSFWorkbook excel = new XSSFWorkbook(in);

        //第一张xlsx数据页
        XSSFSheet sheet = excel.getSheetAt(0);

        // 创建日期格式化对象
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        Integer count = 1;
        for (Product record : records) {
            //第count行
            XSSFRow row = sheet.createRow(count);

            Long categoryid = record.getCategoryId();

            row.createCell(0).setCellValue(record.getName());
            row.createCell(2).setCellValue(
                    categoryid == 1 ? "蔬菜" :
                    categoryid == 2 ? "水果" :
                    categoryid == 3 ? "肉禽" :
                    categoryid == 4 ? "水产" :
                    categoryid == 5 ? "米面粮油" :
                    categoryid == 6 ? "调味干货" :
                    categoryid == 7 ? "乳制品" :
                    categoryid == 8 ? "饮料" :
                    categoryid == 9 ? "花卉药材" : "其它");
            row.createCell(3).setCellValue(record.getPrice().doubleValue());
            row.createCell(4).setCellValue(record.getCreateTime() != null ? dateFormat.format(record.getCreateTime()) : "");
            row.createCell(5).setCellValue(record.getIsRecommend() == 1 ? "是" : "否" );
            row.createCell(6).setCellValue(record.getStatus() == 1 ? "上架" : "下架");

            count++;
        }

        //3.通过输出流将Rxcel文件下载到客服端浏览器
        ServletOutputStream out = response.getOutputStream();
        excel.write(out);

        //关闭资源
        out.close();
        excel.close();
    }
    /**
     * 导出农贸市场数据到Excel
     *
     * @param response HTTP响应
     * @throws IOException IO异常
     */
    @Override
    public void exportMarketData(HttpServletResponse response) throws IOException {
        // 1. 查询数据库，获取所有市场数据
        List<Market> records = marketMapper.selectAll();

        // 2. 通过POI将数据写入到Excel文件中
        InputStream in = this.getClass().getClassLoader().getResourceAsStream("templates/market.xlsx");

        if (in == null) {
            throw new ServiceException("导出模板文件不存在");
        }

        XSSFWorkbook excel = new XSSFWorkbook(in);

        // 获取第一张工作表
        XSSFSheet sheet = excel.getSheetAt(0);

        // 创建日期格式化对象
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        // 从第2行开始写入数据（第1行是标题）
        int rowNum = 1;
        for (Market record : records) {
            XSSFRow row = sheet.createRow(rowNum);

            // 市场编号
            row.createCell(0).setCellValue(record.getMarketId());
            // 市场名称
            row.createCell(1).setCellValue(record.getMarketName());
            // 所在地区
            row.createCell(2).setCellValue(record.getRegion());
            // 创建时间
            row.createCell(3).setCellValue(
                    record.getCreateTime() != null ? dateFormat.format(record.getCreateTime()) : ""
            );
            // 修改时间
            row.createCell(4).setCellValue(
                    record.getModifyTime() != null ? dateFormat.format(record.getModifyTime()) : ""
            );

            rowNum++;
        }

        // 3. 设置响应头，让浏览器下载文件
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setHeader("Content-Disposition", "attachment; filename=market_" + System.currentTimeMillis() + ".xlsx");

        // 4. 通过输出流将Excel文件下载到客户端浏览器
        ServletOutputStream out = response.getOutputStream();
        excel.write(out);

        // 关闭资源
        out.flush();
        out.close();
        excel.close();
        in.close();
    }

    /**
     * 导出农事服务数据到Excel
     *
     * @param response HTTP响应
     * @throws IOException IO异常
     */
    @Override
    public void exportAgriculturalData(HttpServletResponse response) throws IOException {
        // 1. 查询数据库，获取所有农事服务数据
        List<Agricultural> records = agriculturalMapper.selectAll();

        // 2. 通过POI将数据写入到Excel文件中
        InputStream in = this.getClass().getClassLoader().getResourceAsStream("templates/agricultural.xlsx");

        if (in == null) {
            throw new ServiceException("导出模板文件不存在");
        }

        XSSFWorkbook excel = new XSSFWorkbook(in);

        // 获取第一张工作表
        XSSFSheet sheet = excel.getSheetAt(0);

        // 创建日期格式化对象
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        // 从第2行开始写入数据（第1行是标题）
        int rowNum = 1;
        for (Agricultural record : records) {
            XSSFRow row = sheet.createRow(rowNum);

            // 标题
            row.createCell(0).setCellValue(record.getTitle() != null ? record.getTitle() : "");
            // 摘要
            row.createCell(1).setCellValue(record.getDescription() != null ? record.getDescription() : "");
            // 图片
            row.createCell(2).setCellValue(record.getImage() != null ? record.getImage() : "");
            // 价格(元)
            row.createCell(3).setCellValue(record.getPrice() != null ? record.getPrice().doubleValue() : 0.0);
            // 所属分类
            row.createCell(4).setCellValue(record.getCategoryName() != null ? record.getCategoryName() : "");
            // 联系电话
            row.createCell(5).setCellValue(record.getPhone() != null ? record.getPhone() : "");
            // 微信号
            row.createCell(6).setCellValue(record.getWechat() != null ? record.getWechat() : "");
            // 服务商
            row.createCell(7).setCellValue(record.getProviderName() != null ? record.getProviderName() : "");
            // 上架状态
            row.createCell(8).setCellValue(record.getStatus() == 1 ? "已上架" : "未上架");
            // 是否推荐
            row.createCell(9).setCellValue(record.getIsRecommend() == 1 ? "推荐" : "不推荐");
            // 浏览数
            row.createCell(10).setCellValue(record.getBrowseNum() != null ? record.getBrowseNum() : 0);

            rowNum++;
        }

        // 3. 设置响应头，让浏览器下载文件
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setHeader("Content-Disposition", "attachment; filename=agricultural_" + System.currentTimeMillis() + ".xlsx");

        // 4. 通过输出流将Excel文件下载到客户端浏览器
        ServletOutputStream out = response.getOutputStream();
        excel.write(out);

        // 关闭资源
        out.flush();
        out.close();
        excel.close();
        in.close();
    }

    /**
     * 导出信贷信息数据到Excel
     *
     * @param response HTTP响应
     * @throws IOException IO异常
     */
    @Override
    public void exportCreditInfoData(HttpServletResponse response) throws IOException {
        // 1. 查询数据库，获取所有信贷信息数据
        List<CreditInfo> records = creditInfoMapper.selectAll();

        // 2. 通过POI将数据写入到Excel文件中
        InputStream in = this.getClass().getClassLoader().getResourceAsStream("templates/loan.xlsx");

        if (in == null) {
            throw new ServiceException("导出模板文件不存在");
        }

        XSSFWorkbook excel = new XSSFWorkbook(in);

        // 获取第一张工作表
        XSSFSheet sheet = excel.getSheetAt(0);

        // 创建日期格式化对象
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        // 从第2行开始写入数据（第1行是标题）
        int rowNum = 1;
        for (CreditInfo record : records) {
            XSSFRow row = sheet.createRow(rowNum);

            // 文章标题
            row.createCell(0).setCellValue(record.getTitle() != null ? record.getTitle() : "");
            // 作者/来源
            row.createCell(1).setCellValue(record.getAuthorSource() != null ? record.getAuthorSource() : "");
            // 文章提要
            row.createCell(2).setCellValue(record.getSummary() != null ? record.getSummary() : "");
            // 正文内容
            row.createCell(3).setCellValue(record.getContent() != null ? record.getContent() : "");
            // 图片
            row.createCell(4).setCellValue(record.getImage() != null ? record.getImage() : "");
            // 发布时间
            row.createCell(5).setCellValue(
                    record.getPublishTime() != null ? dateFormat.format(record.getPublishTime()) : "");
            // 发布状态
            row.createCell(6).setCellValue(record.getStatus() == 1 ? "已发布" : "未发布");
            // 是否推荐
            row.createCell(7).setCellValue(record.getIsRecommend() == 1 ? "推荐" : "不推荐");
            // 浏览数量
            row.createCell(8).setCellValue(record.getViewCount() != null ? record.getViewCount() : 0);

            rowNum++;
        }

        // 3. 设置响应头，让浏览器下载文件
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setHeader("Content-Disposition", "attachment; filename=loan_" + System.currentTimeMillis() + ".xlsx");

        // 4. 通过输出流将Excel文件下载到客户端浏览器
        ServletOutputStream out = response.getOutputStream();
        excel.write(out);

        // 关闭资源
        out.flush();
        out.close();
        excel.close();
        in.close();
    }

    /**
     * 导出补贴政策数据到Excel
     *
     * @param response HTTP响应
     * @throws IOException IO异常
     */
    @Override
    public void exportAllowancePolicyInfoData(HttpServletResponse response) throws IOException {
        // 1. 查询数据库，获取所有补贴政策数据
        AllowancePolicyDTO dto = new AllowancePolicyDTO();
        List<AllowancePolicyVo> records = nbAllowancePolicyMapper.selectAllowancePolicyList(dto);

        // 2. 通过POI将数据写入到Excel文件中
        // 动态创建Excel工作簿
        XSSFWorkbook excel = new XSSFWorkbook();
        
        // 创建工作表
        XSSFSheet sheet = excel.createSheet("补贴政策数据");
        
        // 创建标题行
        XSSFRow headerRow = sheet.createRow(0);
        String[] headers = {"政策标题", "作者/来源", "政策摘要", "发布时间", "发布状态", "是否推荐", "浏览数量", "创建时间", "更新时间"};
        for (int i = 0; i < headers.length; i++) {
            XSSFCell cell = headerRow.createCell(i);
            cell.setCellValue(headers[i]);
            
            // 设置标题样式（可选）
            XSSFCellStyle style = excel.createCellStyle();
            XSSFFont font = excel.createFont();
            font.setBold(true);
            style.setFont(font);
            cell.setCellStyle(style);
            
            // 自动调整列宽
            sheet.autoSizeColumn(i);
        }

        // 创建日期格式化对象
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        // 从第2行开始写入数据（第1行是标题）
        int rowNum = 1;
        for (AllowancePolicyVo record : records) {
            XSSFRow row = sheet.createRow(rowNum);

            // 政策标题
            row.createCell(0).setCellValue(record.getTitle() != null ? record.getTitle() : "");
            // 作者/来源
            row.createCell(1).setCellValue(record.getAuthorSource() != null ? record.getAuthorSource() : "");
            // 政策摘要
            row.createCell(2).setCellValue(record.getSummary() != null ? record.getSummary() : "");
            // 发布时间
            row.createCell(3).setCellValue(
                    record.getPublishTime() != null ? dateFormat.format(record.getPublishTime()) : "");
            // 发布状态
            row.createCell(4).setCellValue(record.getStatus() == 1 ? "已发布" : record.getStatus() == 0 ? "待发布" : "已下架");
            // 是否推荐
            row.createCell(5).setCellValue(record.getIsRecommend() == 1 ? "推荐" : "不推荐");
            // 浏览数量
            row.createCell(6).setCellValue(record.getViewCount() != null ? record.getViewCount() : 0);
            // 创建时间
            row.createCell(7).setCellValue(
                    record.getCreateTime() != null ? dateFormat.format(record.getCreateTime()) : "");
            // 更新时间
            row.createCell(8).setCellValue(
                    record.getUpdateTime() != null ? dateFormat.format(record.getUpdateTime()) : "");

            rowNum++;
        }

        // 3. 设置响应头，让浏览器下载文件
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setHeader("Content-Disposition", "attachment; filename=allowancePolicy_" + System.currentTimeMillis() + ".xlsx");

        // 4. 通过输出流将Excel文件下载到客户端浏览器
        ServletOutputStream out = response.getOutputStream();
        excel.write(out);

        // 关闭资源
        out.flush();
        out.close();
        excel.close();
    }

}
